import axios from "axios";
import cookie from "react-cookies";
import {Token} from "@/app/constants/authTokenConstants";
import PubSub from 'pubsub-js';

/**
 * axios封装【request和response】
 */
export default function createAxiosClient() {
    /*创建一个axios*/
    const axiosInstance = axios.create({
        baseURL: '/',
        timeout: 60000 // 增加超时时间到30秒
    })

    /*对所有Post请求加Header*/
    axiosInstance.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';

    /*统一请求拦截器*/
    axiosInstance.interceptors.request.use(config => {
        const token = cookie.load(Token);/*获取Token*/
        if (config && config.headers && token) { // 多一步判断
            // 检查token是否已经包含Bearer前缀
            if (token.startsWith('Bearer ')) {
                config.headers['Authorization'] = token;
            } else {
                config.headers['Authorization'] = `Bearer ${token}`;
            }
        }
        return config;
    }, error => {
        return Promise.reject(error);
    });

    /*统一响应拦截器*/
    axiosInstance.interceptors.response.use(response => {
        // 处理业务层面的失败状态
        if (response.data && response.data.code === 401) {
            // 登录过期处理
            console.log("登录已过期，需要重新登录");
            // 清除过期token
            cookie.remove(Token);
            // 发布401事件，通知应用处理
            PubSub.publish('AUTH_EXPIRED', { message: response.data.message });
        }
        
        if (response.status >= 200 && response.status < 300) {
            return Promise.resolve(response)
        } else {
            return Promise.reject(response.data.message)
        }
    }, error => {
        // 处理HTTP层面的401错误
        if (error.response && error.response.status === 401) {
            console.log("授权失败，需要重新登录");
            // 清除过期token
            cookie.remove(Token);
            // 发布401事件，通知应用处理
            PubSub.publish('AUTH_EXPIRED', { message: error.response.data?.message || "登录已过期，请重新登录" });
        }
        
        if (error.response) {
            return Promise.reject(error);
        } else {
            return Promise.reject('请求超时，请稍后重试');
        }
    });
    return axiosInstance;
}
